lexer grammar CLexer;

options {
  language = Java;
  backtrack = true;
}

tokens {
   NUM_REAL;
   NUM_INTEGER;
}

@header {
    package es.etsii.pl.P6_Flexer;
}

BLANCO: (' ' | '\t' | '\r' | '\n') { $channel=HIDDEN; };

//tipos
VOID : 'void';
INT : 'int';
CHAR : 'char';
FLOAT : 'float';
DOUBLE : 'double';

//palabras reservadas
TRUE : 'true';
FALSE : 'false';
IF : 'if';
WHILE : 'while';
FOR : 'for';
DO : 'do';
RETURN : 'return';
BREAK : 'break';
INCLUDETOK : 'include';

fragment DIGITO: ('0'..'9');

NUMERO : ( (DIGITO)+ '.') => (DIGITO)+ '.' (DIGITO)* {$type=NUM_REAL;} 
         | (DIGITO)+ {$type=NUM_INTEGER);}
         ;
         
/*NUM_INTEGER : (DIGITO)+ ;
NUM_REAL : (DIGITO)+ '.' (DIGITO)* ;*/

fragment LETRA : ('a'..'z') | ('A'..'Z') | '_';
ID : LETRA (LETRA | DIGITO)*; //| DOT)*; //se añade punto para ej.: libreria.h 
CADENA: '\"' (~('\"'))* '\"';
CARACTER: '\'' LETRA '\'';



NUMBERSIGN: '#';  
DOT: '.';
COLON: ':';
SEMICOLON: ';';
COMMA: ',';
ASSIGN: '=';

LPARENTHESIS: '(';
RPARENTHESIS: ')';
LCURLY: '{'; //curly brace
RCURLY: '}';
LBRACKET: '[';
RBRACKET: ']';

LESS: '<';
GREATER: '>';
NOTEQUAL: '!=';
LESSEQUAL: '<=';
GREATEQUAL: '>=';

QUESTION: '?';
PLUS: '+';
MINUS: '-';
ASTERISK: '*';
DIV: '/';

OR: '||';
AND: '&&';
NOT: '!';

INC: PLUS PLUS;
DEC: MINUS MINUS;
//BOOL: TRUE | FALSE; //"true" | "false";

COMMENT_LINE: '//' (options {greedy=false;}:.)* ('\r' | '\n') { $channel=HIDDEN; };
COMENTARIO: '/*' (options {greedy=false;}:.)* '*/' { $channel=HIDDEN; };
